package net.jueb.frameworkDemo.orm.redis.jdbc;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedis;

/**
 * 分片
 * @author Administrator
 */
public class SharedTest {
	
	ShardedJedis redis;
	
	public SharedTest(JedisShardInfo ...shards) {
		redis = new ShardedJedis(Arrays.asList(shards));
	}
	
	/**
	 * set
	 * get
	 * setnx
	 * msetnx
	 * mset
	 * mget
	 * getSet
	 * setrange
	 * getrange
	 * append
	 * incr
	 * get
	 * strlen
	 */
	public void test_String()
	{
		//设置获取单个键值
		redis.set("name","tom");
		System.out.println(redis.get("name"));//tom
		
		//设置name键的值为kitty,如果键存在则返回0,不存在着返回1并且完成设置
		System.out.println(redis.setnx("name","kitty"));//0
		System.out.println(redis.get("name"));//tom
		
		System.out.println(redis.setnx("name2","kitty"));//1
		System.out.println(redis.get("name2"));//kitty
		
//		//同时设置多个键值对 要么 全成功,要么全失败
//		redis.mset("sex","women","age","22");
//		//同时设置多个键值对 如果键全存在则返回0,不存在着返回1并设置值
//		System.out.println(redis.msetnx("sex","men","age","23"));//0
//		
//		//返回多个键的值,不存在的返回null
//		System.out.println(redis.mget("name","sex","age","age2"));//[tom, women, 22, null]
		
		//获取一个值并设置新值
		System.out.println(redis.getSet("name", "kitty2"));//tom
		System.out.println(redis.get("name"));//kitty2
		
		//将值得前5位字符串和后面的拼接,返回拼接后的字符串长度
		System.out.println(redis.setrange("name", 5, " parry"));//11
		System.out.println(redis.get("name"));//kitty parry
		//name键的值取范围字符串
		System.out.println(redis.getrange("name",0, 5));//kitty 
		
		//给键的值追加内容,返回追加后值的长度
		System.out.println(redis.append("name","!"));//12
		System.out.println(redis.get("name"));//kitty parry!
		
		//给值递增,返回递增后的值
		System.out.println(redis.incr("age"));//23
		System.out.println(redis.get("age"));//23
		//给值递减,返回递减后的值
		System.out.println(redis.decr("age"));//22
		System.out.println(redis.get("age"));//22
		
		//取值的字符串长度
		System.out.println(redis.strlen("name"));//12
		System.out.println(redis.strlen("age"));//2
	}
	
	public void test_Hash()
	{
		//设置一个role集合的键值对
		redis.hset("role", "name", "tony");
		redis.hset("role","age", "24");
		//设置一个不存在的属性,如果不存在则设置并返回1,否则不覆盖原来的值返回0
		redis.hsetnx("role", "age", "25");
		System.out.println(redis.hmget("role","name","age"));//[tony, 24]
		
		//设置一个tree item集合
		redis.hset("role:001","name", "tony");
		redis.hset("role:001","age", "24");
		System.out.println(redis.hget("role:001", "name"));//tony
		System.out.println(redis.hget("role:001", "age"));//24
		
		//批量设置集合属性
		Map<String,String> map=new HashMap<>();
		map.put("name", "kitty");
		map.put("age", "24");
		redis.hmset("role:002", map);
		redis.hmset("role:min:002", map);//形成节点:role/min/
		System.out.println(redis.hmget("role:002", "name","age"));//[kitty, 24]
		System.out.println(redis.hmget("role:min:002", "name","age"));//[kitty, 24]
		
		//值递增递减
		System.out.println(redis.hincrBy("role:002", "age", 2));//26
		System.out.println(redis.hincrBy("role:002", "age", -2));//24
		
		//判断是否存在某个属性键
		System.out.println(redis.hexists("role:002", "age"));//true
		
		//返回hash集合所有属性名
		System.out.println(redis.hkeys("role:002"));//[name, age]
		
		//返回hash集合所有的值
		System.out.println(redis.hvals("role:002"));//[24, kitty]
		
		//返回hash集合表中字段数量
		System.out.println(redis.hlen("role:002"));//2
		
		//删除hash集合的属性和值,成功返回1 失败返回0
		System.out.println(redis.hdel("role:002", "age"));//1
		
		//返回所有的字段和值
		System.out.println(redis.hgetAll("role:002"));//{name=kitty}
	}
	
	/**
	 * 双向链表
	 */
	public void test_List()
	{
		//删除list数组集合
		redis.del("list");
		
		//从头压入
		redis.lpush("list", "c","d");//d,c
		
		//从尾部压入
		redis.rpush("list", "e","f");//d,c,e,f
		
		//取数组长度
		System.out.println(redis.llen("list"));//2
		
		//修改索引对应的值
		redis.lset("list", 0, "a");//a,c,e,f
		redis.lset("list", 1, "b");//a,b,e,f
		
		//取索引对应的值
		System.out.println(redis.lindex("list", 0));//a
		System.out.println(redis.lindex("list", 1));//b
		
		//移除最前面的值
		System.out.println(redis.lpop("list"));//a
		//移除最后面的值
		System.out.println(redis.rpop("list"));//f
		
		//删除值为e的数据,删除最多12个满足的
		redis.lrem("list", 12, "e");
		System.out.println(redis.lindex("list", 0));//b
		
//		//从一个链表弹出,在从头部压入到另一个链表
//		redis.rpoplpush("list", "list2");
//		System.out.println(redis.lindex("list2", 0));//b
	}
	
	public void test_Set()
	{
		redis.del("set");
		//添加元素
		redis.sadd("set", "a");
		redis.sadd("set", "b");
		redis.sadd("set", "c");
		redis.sadd("set", "e");
		//删除元素
		redis.srem("set","c");
		//随机移除一个元素
		System.out.println(redis.spop("set"));
		//查看所有元素
		System.out.println(redis.smembers("set"));
		
		redis.sadd("set1", "1");
		redis.sadd("set1", "2");
		redis.sadd("set2", "1");
		redis.sadd("set2", "3");
//		//返回2个集合的差异
//		System.out.println(redis.sdiff("set1","set2"));//2
//		System.out.println(redis.sdiff("set2","set1"));//3
//		//将集合的差异值存储到另外一个集合
//		redis.sdiffstore("set_sdiff", "set1","set2");
//		
//		//求交集
//		System.out.println(redis.sinter("set1","set2"));
//		//将交集存储到另外一个集合
//		System.out.println(redis.sinterstore("set_sinter","set1","set2"));
//		
//		//求并集
//		System.out.println(redis.sunion("set1","set2"));
//		//将并集存储到另外一个集合
//		System.out.println(redis.sunionstore("set_sunion","set1","set2"));
//		
//		//从一个集合中移动一个元素到另外一个元素
//		redis.sadd("set3", "4");
//		System.out.println(redis.smove("set3", "set_sunion", "4"));
		
		//查看集合元素个数
		System.out.println(redis.scard("set_sunion"));
		
		//判断元素是否存在于该集合
		System.out.println(redis.sismember("set_sunion", "4"));
		
		//随机取出元素
		System.out.println(redis.srandmember("set_sunion",2));
	}
	
	/**
	 * 有序集合
	 * 排行榜用zset，等级vip用score的小数部分处理
	 * 比如vip1的1w分就是10000.1  vip3就是10000.3
	 */
	public void test_ZSet()
	{
		redis.del("zset");
		//添加集合元素并指定排序值
		redis.zadd("zset", 1, "a");
		redis.zadd("zset", 2, "b");
		redis.zadd("zset", 3, "c");
		redis.zadd("zset", 3, "d");
		
		//删除集合元素
		redis.zrem("zset","d");
		
		//递增排序序号,如果没有,就创建
		redis.zincrby("zset", 4, "a");//a的权值等于5
		
		//按排名范围取元素
		System.out.println(redis.zrange("zset", 0, 3));//[a, b, c, d]
		
		//按排名权值取元素,此时过滤掉a
		System.out.println(redis.zrangeByScore("zset", 1, 3));
		
		//取正向排名
		System.out.println(redis.zrank("zset", "a"));//0
		System.out.println(redis.zrank("zset", "b"));//1
		System.out.println(redis.zrank("zset", "c"));//2
		
		//取反向排名
		System.out.println(redis.zrevrank("zset", "a"));//2
		System.out.println(redis.zrevrank("zset", "b"));//1
		System.out.println(redis.zrevrank("zset", "c"));//0
		
		//取集合元素个数
		System.out.println(redis.zcard("zset"));
		
		//移除有序集中,指定排名(rank)区间内的所有成员
		System.out.println(redis.zremrangeByRank("zset", 1, 2));
		
//		//移除有序集中，指定分数（score）区间内的所有成员
		System.out.println(redis.zremrangeByScore("zset", 4, 5));
	}
	
	/**
	 * 常用命令
	 */
	public void test_Normal()
	{
//		redis.keys("*");//正则表达式匹配所有的键名
		redis.exists("role");//判断是否存在键
		redis.del("role");//删除键
		redis.expire("role", 100);//设置过期时间
		//查看键的过期时间当 key 不存在时，返回 -2 。 当 key存在但没有设置剩余生存时间时,返回 -1 。 否则，以秒为单位，返回 key 的剩余生存时间。
		redis.ttl("role");	
		//类似于 TTL 命令，但它以毫秒为单位返回 key 的剩余生存时间，而不是像 TTL 命令那样，以秒为单位
		redis.pttl("role");
//		redis.select (2);//选择数据库0-16
		redis.move("role", 3);//移动键集合到另外一个数据库
		redis.persist("role");//取消键的过期时间
//		redis.randomKey();//随机返回一个键的值
//		redis.rename("role","newrole");//重命名一个键
		redis.type("role");//返回一个键的数据类型
	}
	
	/**
	 * 服务端命令
	 */
	public void test_Server()
	{
		redis.echo("");//命令用于打印给定的字符串。
//		redis.ping();//注解是否能链接
//		redis.quit();//退出连接
//		redis.dbSize();//返回数据库的键的个数
//		redis.info();//返回服务器相关信息
//		redis.configGet("");//正则表达式匹配返回服务器配置信息
//		redis.flushDB();//清空数据库
//		redis.flushAll();//删除所有数据库中所有的键
	}
}
